package com.rui.shangXueTang.stack;

/**
 * @author : [锐神NO.3]
 * @version : [v1.0]
 * @className : ArrayStack
 * @createTime : [2022/2/13 16:20]
 * @description : [描述该类的功能]
 */

@SuppressWarnings("all")
public class ArrayStack {

    /**
     * 栈的大小
     */
    private int maxStack;

    /**
     * 用数组模拟栈
     */
    private int[] stack;

    /**
     * 表示栈顶所在的位置，如果没有数据时，使用-1
     */
    private int top = -1;

    /**
     * 初始化栈 使用有参构造器
     *
     * @param maxStack 栈的大小
     */
    public ArrayStack(int maxStack) {
        this.maxStack = maxStack;
        this.stack = new int[this.maxStack];
    }

    /**
     * 1.压栈
     * 2.弹栈
     * 3.判断当前是否是空栈
     * 4.当前栈是否是满栈
     */

    /**
     * 判断当前栈是否以满
     *
     * @return boolean
     */
    public boolean isFull() {
        return this.top == this.maxStack - 1;
    }

    /**
     * 判断当前栈是否为空
     *
     * @return boolean
     */
    public boolean isEmpty() {
        return this.top == -1;
    }

    /**
     * 压栈
     */
    public void push(int val) {
        //判断是否满
        if (isFull()) {
            System.out.println("栈已满");
            return;
        }
        this.top++;
        this.stack[this.top] = val;
    }

    /**
     * 弹栈
     */
    public int pop() {
        //判断是否为空
        if (isEmpty()) {
            System.out.println("栈已空");
            return -1;
        }
        int value = stack[this.top];
        this.top--;
        return value;
    }

    /**
     * 该方法查看栈中的所有元素
     */
    public void list() {
        //是否是空
        if (isEmpty()) {
            System.out.println("栈已空");
            return;
        }
        System.out.println("当前栈中的元素是:");
        for (int i = this.top; i >= 0; i--) {
            System.out.println(this.stack[i]);
        }
    }

    /**
     * 获取当前栈的长度
     *
     * @return
     */
    public int length() {
        return this.top + 1;
    }

    /**
     * 判断是否是一个运算符
     */
    public boolean isOper(char c) {
        return c == '+' || c == '-' || c == '*' || c == '/';
    }

    /**
     * 判断运算符的优先级 用数字表示，数字越大的  优先级越大
     */
    public int priority(int oper) {
        if (oper == '+' || oper == '-') {
            return 0;
        } else if (oper == '*' || oper == '/') {
            return 1;
        } else {
            return -1;
        }
    }

    /**
     * 获取栈的容量
     */
    public int getStackSize() {
        return this.stack.length;
    }

    /**
     * 查看栈顶元素
     */
    public int peek() {
        return this.stack[this.top];
    }

    /**
     * 计算两个数的运算结果
     */
    public int calculate(int num1, int num2, int oper) {
        //计算结果
        int result = 0;
        switch (oper) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num2 - num1;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num2 / num1;
                break;
            default:
                System.out.println("结果计算错误");
                break;
        }
        return result;
    }
}
